//
// Created by admin on 2020/7/17.
//

#include "demo.h"

/*
 * 初始化栈，栈顶等于栈底；
 * 栈可用容量等于顺序表长度。
 * 时间复杂度:O(1)
 * 空间复杂度:O(1)
 */
SqStack InitStack(){
    int *SElem = (int *)malloc(sizeof(int) * MAXSTACKLENGTH);
    if (!SElem){
        exit(0);
    }
    SqStack sqStack;
    sqStack.base = SElem;
    sqStack.top = SElem;
    sqStack.stacksize = MAXSTACKLENGTH;
    return sqStack;
}

/*
 * 当栈顶等于栈底时，栈为空；
 * 时间复杂度:O(1)
 * 空间复杂度:O(1)
 */
int StackEmpty(SqStack S){
    if (S.base == S.top){
        return 1;
    } else{
        return 0;
    }
}

/*
 * 把栈顶减栈底，就得到了长度；
 * 时间复杂度:O(1)
 * 空间复杂度:O(1)
 */
int StackLength(SqStack S){
    return S.top-S.base;
}

/*
 * 将栈底赋值给栈顶，栈视为就清空了；
 * 时间复杂度:O(1)
 * 空间复杂度:O(1)
 */
int ClearStack(SqStack *S){
    if (S->base) {
        S->top = S->base;
        return 1;
    } else{
        return 0;
    }
}

/*
 * 释放栈底，将栈可用容量改为0；
 * 将栈顶与栈底重置为空
 * 时间复杂度:O(1)
 * 空间复杂度:O(1)
 */
int DestroyStack(SqStack *S){
    if (S->base){
        free(S->base);
        S->stacksize = 0;
        S->base = S->top = NULL;
        return 1;
    } else{
        return 0;
    }
}

/*
 * 如果栈顶减栈底小于栈可用容量，则添加；
 * 将数据赋值给栈顶，并将栈顶上移动一位；
 * 时间复杂度:O(1)
 * 空间复杂度:O(1)
 */
int Push(SqStack *S,int data){
    if (S->top - S->base < S->stacksize){
        *S->top++ = data;
        return 1;
    } else{
        return 0;
    }
}

/*
 * 如栈不为空，则出栈；
 * 将栈顶下移动一位，取出数据并返回；
 * 时间复杂度:O(1)
 * 空间复杂度:O(1)
 */
int Pop(SqStack *S){
    if (S->top != S->base){
        return *--S->top;
    } else{
        printf("Stack Is Empty!");
    }
}

/*
 * 如栈不为空，则取数据；
 * 将栈顶下移一位，取出数据并返回；
 * 时间复杂度:O(1)
 * 空间复杂度:O(1)
 */
int GetTop(SqStack S){
    if (S.top != S.base){
        return *--S.top;
    } else{
        printf("Stack Is Empty!");
    }
}